define("ace/mode/diff_highlight_rules", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text_highlight_rules"], function (require, exports, module) {
    "use strict";

    var oop = require("../lib/oop");
    var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;

    var DiffHighlightRules = function () {

        this.$rules = {
            "start": [{
                regex: "^(?:\\*{15}|={67}|-{3}|\\+{3})$",
                token: "punctuation.definition.separator.diff",
                "name": "keyword"
            }, { //diff.range.unified
                regex: "^(@@)(\\s*.+?\\s*)(@@)(.*)$",
                token: [
                    "constant",
                    "constant.numeric",
                    "constant",
                    "comment.doc.tag"
                ]
            }, { //diff.range.normal
                regex: "^(\\d+)([,\\d]+)(a|d|c)(\\d+)([,\\d]+)(.*)$",
                token: [
                    "constant.numeric",
                    "punctuation.definition.range.diff",
                    "constant.function",
                    "constant.numeric",
                    "punctuation.definition.range.diff",
                    "invalid"
                ],
                "name": "meta."
            }, {
                regex: "^(\\-{3}|\\+{3}|\\*{3})( .+)$",
                token: [
                    "constant.numeric",
                    "meta.tag"
                ]
            }, { // added
                regex: "^([!+>])(.*?)(\\s*)$",
                token: [
                    "support.constant",
                    "text",
                    "invalid"
                ]
            }, { // removed
                regex: "^([<\\-])(.*?)(\\s*)$",
                token: [
                    "support.function",
                    "string",
                    "invalid"
                ]
            }, {
                regex: "^(diff)(\\s+--\\w+)?(.+?)( .+)?$",
                token: ["variable", "variable", "keyword", "variable"]
            }, {
                regex: "^Index.+$",
                token: "variable"
            }, {
                regex: "^\\s+$",
                token: "text"
            }, {
                regex: "\\s*$",
                token: "invalid"
            }, {
                defaultToken: "invisible",
                caseInsensitive: true
            }
            ]
        };
    };

    oop.inherits(DiffHighlightRules, TextHighlightRules);

    exports.DiffHighlightRules = DiffHighlightRules;
});

define("ace/mode/folding/diff", ["require", "exports", "module", "ace/lib/oop", "ace/mode/folding/fold_mode", "ace/range"], function (require, exports, module) {
    "use strict";

    var oop = require("../../lib/oop");
    var BaseFoldMode = require("./fold_mode").FoldMode;
    var Range = require("../../range").Range;

    var FoldMode = exports.FoldMode = function (levels, flag) {
        this.regExpList = levels;
        this.flag = flag;
        this.foldingStartMarker = RegExp("^(" + levels.join("|") + ")", this.flag);
    };
    oop.inherits(FoldMode, BaseFoldMode);

    (function () {
        this.getFoldWidgetRange = function (session, foldStyle, row) {
            var line = session.getLine(row);
            var start = {row: row, column: line.length};

            var regList = this.regExpList;
            for (var i = 1; i <= regList.length; i++) {
                var re = RegExp("^(" + regList.slice(0, i).join("|") + ")", this.flag);
                if (re.test(line))
                    break;
            }

            for (var l = session.getLength(); ++row < l;) {
                line = session.getLine(row);
                if (re.test(line))
                    break;
            }
            if (row == start.row + 1)
                return;
            return Range.fromPoints(start, {row: row - 1, column: line.length});
        };

    }).call(FoldMode.prototype);

});

define("ace/mode/diff", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/mode/diff_highlight_rules", "ace/mode/folding/diff"], function (require, exports, module) {
    "use strict";

    var oop = require("../lib/oop");
    var TextMode = require("./text").Mode;
    var HighlightRules = require("./diff_highlight_rules").DiffHighlightRules;
    var FoldMode = require("./folding/diff").FoldMode;

    var Mode = function () {
        this.HighlightRules = HighlightRules;
        this.foldingRules = new FoldMode(["diff", "index", "\\+{3}", "@@|\\*{5}"], "i");
    };
    oop.inherits(Mode, TextMode);

    (function () {

        this.$id = "ace/mode/diff";
    }).call(Mode.prototype);

    exports.Mode = Mode;

});
